function pacificAtlantic(heights) {
  if (!heights || heights.length === 0) return [];

  const m = heights.length;
  const n = heights[0].length;

  // 创建两个矩阵标记能流向太平洋和大西洋的单元格
  const pacific = Array.from({ length: m }, () => new Array(n).fill(false));
  const atlantic = Array.from({ length: m }, () => new Array(n).fill(false));

  // 定义四个方向的移动
  const directions = [
    [-1, 0],
    [1, 0],
    [0, -1],
    [0, 1],
  ];

  // 深度优先搜索函数
  function dfs(row, col, ocean) {
    // 标记当前单元格可以流向该海洋
    ocean[row][col] = true;

    // 检查四个方向
    for (const [dr, dc] of directions) {
      const newRow = row + dr;
      const newCol = col + dc;

      // 检查新位置是否在边界内，且未被访问过，且高度不小于当前单元格
      if (
        newRow >= 0 &&
        newRow < m &&
        newCol >= 0 &&
        newCol < n &&
        !ocean[newRow][newCol] &&
        heights[newRow][newCol] >= heights[row][col]
      ) {
        dfs(newRow, newCol, ocean);
      }
    }
  }

  // 从太平洋的边界开始搜索
  // 上边界
  for (let col = 0; col < n; col++) {
    dfs(0, col, pacific);
  }
  // 左边界
  for (let row = 0; row < m; row++) {
    dfs(row, 0, pacific);
  }

  // 从大西洋的边界开始搜索
  // 下边界
  for (let col = 0; col < n; col++) {
    dfs(m - 1, col, atlantic);
  }
  // 右边界
  for (let row = 0; row < m; row++) {
    dfs(row, n - 1, atlantic);
  }

  // 找出既能流向太平洋又能流向大西洋的单元格
  const result = [];
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (pacific[i][j] && atlantic[i][j]) {
        result.push([i, j]);
      }
    }
  }

  return result;
}

// 测试示例
console.log(
  pacificAtlantic([
    [1, 2, 2, 3, 5],
    [3, 2, 3, 4, 4],
    [2, 4, 5, 3, 1],
    [6, 7, 1, 4, 5],
    [5, 1, 1, 2, 4],
  ])
);
// 输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]

console.log(
  pacificAtlantic([
    [2, 1],
    [1, 2],
  ])
);
// 输出: [[0,0],[0,1],[1,0],[1,1]]
